package com.cskaoyan.javase.array._5variable;

/**
 * 可变参数的语法:
 * [修饰符列表] 返回值类型 方法名 (形式参数列表,数据类型... 变量名){
 *   //方法体
 * }
 *
 * 注意事项:
 *      1.可变参数用于形参列表中，并且只能出现在形参列表的最后。
 *      2.可变参数的三个点位于数据类型和变量名之间，前后有无空格都可以。最好是前无空格，后有空格。
 *      和数据类型连在一起,表示对应数据类型可变参数,类似对应类型数组
 *      3.调用可变参数的方法时，编译器为该可变参数隐含创建一个数组，在方法体中以数组的形式访问可变参数。
 *      如果一个方法的形参就是一个数组,那么在调用方法时,该数组由程序员自己创建
 *      但是如果方法的形参是一个可变参数,那么在调用方法时,这写不确定个数的参数
 *          由编译器代为创建成一个数组
 *      像这种实现的原理不变,但是程序员少做操作,底层(编译器,JVM)多做操作的语法设计
 *      称之为"语法糖"
 *      语法糖可以放程序员更省心,写出更简洁的代码
 *
 *      4.可变参数必须处在形参列表的最后,所以一个方法不可能有两个可变参数
 *
 * 关于方法调用过程中的可变参数:
 *      1.如果有固定参数的方法和可变参数的方法同时匹配,那么优先匹配固定参数的方法
 *      2.两个带有可变参数的方法同样是可以构成方法重载的,但是容易出现
 *          模糊的方法调用
 *          实际开发中,要小心使用
 *          一般来说要避免两个可变参数的方法，发生方法重载
 *
 *
 * @since 11:37
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo2 {
    public static void main(String[] args) {
        /*test(1, 2, 3);
        // 数组存储元素,也是存在自动类型转换的
        byte a = 10;
        test(a, 10, 20);
        int[] arr = {1, a, 200};
        test(1.1, 2, 3,100 );*/

        /*test(1, 2);
        test(1, 2, 3);*/

        // Ambiguous method call: both 'Demo2.test(int...)' and 'Demo2.test(int, int...)' match
        // 就近原则失效,模糊的方法调用,编译报错
        // test(1,2);
    }

    // alt + ctrl + L 格式化代码 没写几行代码就按一次
    public static void test(int... arr) {
    }

    public static void test(int a, int... arr) {
    }
    // public static void test(int a, int b) {
    // }

    // public static void test(double... arr) {
    // }
}
